// EvaluatingPlayerList.h : interface of the CEvaluatingPlayerList class

// Deklaracia zoznamu, do ktoreho sa budu ukladat hraci ziskani z vizualnej informacie hraca

#ifndef EVALUATING_PLAYER_LIST_H
#define EVALUATING_PLAYER_LIST_H

// disable warning C4786: symbol greater than 255 character,
// okay to ignore this warning
#pragma warning(disable: 4786)


#include "EvaluatingPlayer.h"
#include "EvaluatingPanesMap.h"

#include <list>

using namespace std;

class CEvaluatingPlayerList
{
	list<CEvaluatingPlayer*> playerList;

	CEvaluatingPanesMap* evPanesMap;

public:

	CEvaluatingPlayerList(CEvaluatingPanesMap* evPanMap)
	{
		evPanesMap = evPanMap;
	}	

	~CEvaluatingPlayerList();

	// Iterator pre zoznam hracov -> pouziva sa pre pristup do zoznamu
	list<CEvaluatingPlayer*>::iterator	evPlayerIterator;

	list<CEvaluatingPlayer*>::iterator GetEvPlayerIteratorBegin()	{ return playerList.begin(); }
	list<CEvaluatingPlayer*>::iterator GetEvPlayerIteratorEnd()		{ return playerList.end();	 }

	// Nachadza sa hociktory hrac v oblasti s danym polomerom?
	bool AnyoneInAreaRadius(Point position, double lfRadius);

	// Vypocita vhodnu poziciu v okoli hraca pre normalnu nahravku. Vrati false, ak sa taka pozicia nenajde.
	bool CalculateNormalPassPosition(double lfMyselfPosX, double lfMyselfPosY, double& lfPosX, double& lfPoxY);

	// Vrati sa pointer na polickovu mapu ihriska
	CEvaluatingPanesMap* GetEvaluatingPanesMap()
	{
		return evPanesMap;
	}

	// Pomocne funkcie, ktore urobia potrebne kroky pred volanim hlavnej funkcie v gradientovej mape 
	bool CalculateOptimalDribblePointAux(double& lfDribblePosX, double& lfDribblePosY, double lfRadius);
	void CalculateOptimalShootPointAux(double& lfShootPosX, double& lfShootPosY, double lfHalfGoalSize);
	bool CalculateReceiveBallPositionAux(double& lfMyPosX, double& lfMyPosY, double lfBallPosX, double lfBallPosY);

	// Vypocita najvyhodnejsiu poziciu hraca pre nabiehanie si pre prihravku
	bool CalculateReceiveBallPosition(double& lfMyPosX, double& lfMyPosY, double lfBallPosX, double lfBallPosY);

	// Testuje a opravuje duplicitu hraca s dresom cislo 0
	bool CheckDuplicityPlayerInfo(CEvaluatingPlayer* pTestPlayer);

	// Funkcia odporuci hraca, ktoremu by sa malo nahrat pri zahravani typu KickOff podla ohodnoteni v jeho oblasti.
	CEvaluatingPlayer* GetKickOffPlayer();

	// Funkcia sluzi na inkrementovanie veku zaznamenanaj informacii o hracovi o 1 cyklus
	void IncrementPlayerInformationAge();

	// Vlozi informaciu o hracovi do zoznamu
	void InsertPlayerInformation(CEvaluatingPlayer* pEvPlayer);

	// Je hrac s danym cislom v uz v zozname hracov?
	CEvaluatingPlayer* IsPlayerInTheList(PlayerType ePType, int nIDnumber);
 
	// Nachadza sa hociktory hrac daneho typu v kruznici so suradnicami x,y a polomerom r?
	bool IsPlayerTypeInTheCircle(double lfCircleCenterX, double lfCircleCenterY, double lfCircleRadius, PlayerType emPlayerType);

	// Vrati true, ak v mojom okoli nie su nejaki blizki, neznami alebo superovi hraci
	bool NoEnemiesAround(Point myPos);

	// Vrati true, ak v mojom okoli su nejaki blizki hraci
	bool NearbyEnemiesAround(Point myPos);

	// Mam nejakych spoluhracov v superovom pokutovom pasme?
	bool OurPlayersInEnemyPenaltyArea();

	// Nastavi pozicie vsetkych hracov, tak ako budu v dalsom kroku zapasu
	void PredictNextPositions();

	// Nastavi pozicie vsetkych hracov na povodne hodnoty
	void ReturnToActualPositions();

	// Odstrani vsetky informacie o hracoch urciteho typu
	void RemoveAllPlayerTypeInformation(PlayerType emPlayerType);

	// Odstrani informaciu o hracovi zo zoznamu
	void RemovePlayerInformation(CEvaluatingPlayer* pEvPlayer);

	// Odstrani informacie o hracoch starsich ako N cyklov
	void RemoveOldPlayerInformation(int nMaxCycles);
	
	
	
};




#endif // EVALUATING_PLAYER_LIST_H
